package cn.attaching.security;

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * SHA 家族的加密算法
 * 高杰创建于 2017/01/19.
 */
public class ShaSecurity {
    private static final String SHA1 = "SHA";
    private static final String SHA256 = "SHA-256";
    private static final String SHA384 = "SHA-384";
    private static final String SHA512 = "SHA-512";
    /**
     * 进行 SHA-1 加密
     * @param src 要加密的字符串
     * @return 加密后的密文
     * @throws Exception 如果无法找到算法则会报错
     */
    public static String getSha1(String src) throws Exception {
        return getSha(src,SHA1);
    }
    /**
     * 进行 SHA-256 加密
     * @param src 要加密的字符串
     * @return 加密后的密文
     * @throws Exception 如果无法找到算法则会报错
     */
    public static String getSha256(String src) throws Exception {
        return getSha(src,SHA256);
    }
    /**
     * 进行 SHA-342 加密
     * @param src 要加密的字符串
     * @return 加密后的密文
     * @throws Exception 如果无法找到算法则会报错
     */
    public static String getSha384(String src)throws Exception{
        return getSha(src,SHA384);
    }

    /**
     * 进行 SHA-512 加密
     * @param src 要加密的字符串
     * @return 加密后的密文
     * @throws Exception 如果无法找到算法则会报错
     */
    public static String getSHA512(String src) throws Exception {
        return getSha(src,SHA512);
    }

    /**
     * 使用 系统提供的加密算法进行加密
     * @param src 要加密的字符串
     * @param arthName 算法名称
     * @return 如果无法找到算法则抛出异常
     */
    private static String getSha(final String src,final String arthName) throws Exception {
        if(src == null || src.length() == 0) return "";
        try {
            MessageDigest md5 = MessageDigest.getInstance(arthName);
            byte[] bytes = src.getBytes(Charset.forName("UTF-8"));
            md5.update(bytes);
            byte[] after = md5.digest();
            return TypeConversion.bytesToHexString(after);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无法找到加密方法", e);
        }
    }

}
